﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DAO;
using System.Data;
using Entidad;

public partial class CU_Central_RegistrarVentas : System.Web.UI.Page
{
    VentaDAO interfazDAO;



    static int NumeroFactura;


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            interfazDAO = new VentaDAO();
            cargarComboTipoFactura();

            Session["ListaDetalle"] = new List<DetalleFacturaEnt>();
            Session["ListaDetalleDAO"] = new List<DetalleFacturaEnt>();
            Session["ListaSeleccion"] = new List<EjemplarBusquedaQueryEnt>();
            Session["ListaEjemplares"] = interfazDAO.ejemplaresGrilla("disponibilidad", true);

            cargarGrilla((List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"]);

            if (int.TryParse(Request.QueryString["numero"], out NumeroFactura))
            {

                lbl_grd_Ejemplares.Visible = false;
                Actualizar();

            }
            else
            {
                nueva();
            }
            grd_Ejemplares.DataBind();
            grd_Seleccion.DataBind();
            txtFecha.Enabled = false;

        }


    }

    protected void nueva()
    {
        NumeroFactura = (int)interfazDAO.ObtenerNumeroUltima() + 1;
        txt_NroFactura.Text = NumeroFactura.ToString();
        txtFecha.Text = (DateTime.Now).ToShortDateString();
        btn_Actualizar.Visible = false;
        btn_Aceptar.Visible = true;
        btn_Aceptar.Enabled = true;
        grd_Seleccion.DataSource = new List<EjemplarBusquedaQueryEnt>();
        grd_Seleccion.DataBind();

    }
    protected void Actualizar()// Para anular
    {
        grd_Ejemplares.Enabled = false;
        grd_Seleccion.Enabled = false;
        btn_Aceptar.Visible = false;
        DetalleFacturaDAO iDetalleDAO = new DetalleFacturaDAO();

        List<DetalleFacturaEnt> detalles = iDetalleDAO.ObtenerDetalles(NumeroFactura);
        Session["ListaDetalle"] = detalles;
        //Session["ListaDetalleDAO"] = detalles;
        VentaDAO iFactura = new VentaDAO();
        FacturaEnt factura = iFactura.ObtenerFactura(NumeroFactura);
        txt_NroFactura.Text = factura.Numero.ToString();
        txtFecha.Text = factura.Fecha.ToShortDateString();
        txtTotal.Text = decimal.Round(factura.Total, 2).ToString();
        cboTipoFactura.ClearSelection();
        cboTipoFactura.SelectedIndex = int.Parse(cboTipoFactura.Items.FindByValue(factura.TipoFacturaID.ToString()).Value);
        cargarGrillaSeleccion(ObtenerEjemplaresDetalle(detalles));
        btn_Aceptar.Enabled = false;
        btn_Actualizar.Enabled = true;
        btn_Actualizar.Visible = true;



    }

    protected List<EjemplarBusquedaQueryEnt> ObtenerEjemplaresDetalle(List<DetalleFacturaEnt> detalles)
    {
        interfazDAO = new VentaDAO();

        List<EjemplarBusquedaQueryEnt> ejemplaresDAO = new List<EjemplarBusquedaQueryEnt>();
        List<EjemplarBusquedaQueryEnt> resultado = new List<EjemplarBusquedaQueryEnt>();
        ejemplaresDAO = interfazDAO.ejemplaresGrilla();
        foreach (EjemplarBusquedaQueryEnt ejemplar in ejemplaresDAO)
        {
            foreach (DetalleFacturaEnt det in detalles)
            {
                if (det.id_Ejemplar == ejemplar.Id_Ejemplar)
                {
                    resultado.Add(ejemplar);
                }
            }
        }
        return resultado;
    }

    protected void btn_Actualizar_Click(object sender, EventArgs e)
    {
        bool resultadoTransaccion;
        DetalleFacturaDAO interfazDetalles = new DetalleFacturaDAO();
        List<DetalleFacturaEnt> DetallesPAG = ((List<DetalleFacturaEnt>)Session["ListaDetalle"]);
        List<DetalleFacturaEnt> DetallesDAO = interfazDetalles.ObtenerDetalles(NumeroFactura);

        UsuarioDAO interfazUsuario = new UsuarioDAO();
        UsuarioEnt usuarioVenta = new UsuarioEnt();
        VentaDAO interfazDAO = new VentaDAO();
        FacturaEnt factura = new FacturaEnt();

        usuarioVenta = (interfazUsuario.buscarUsuarioFiltro(" AND u.legajo=" + Context.User.Identity.Name + " ")).ElementAt(0); //si funciona... Trata de mejorar esto jaja
        factura.Fecha = DateTime.Parse(txtFecha.Text);
        factura.Numero = int.Parse(txt_NroFactura.Text);
        factura.UsuarioID = usuarioVenta.id_Usuario;
        factura.Total = decimal.Parse(txtTotal.Text);
        factura.TipoFacturaID = cboTipoFactura.SelectedIndex;


        resultadoTransaccion = interfazDAO.anularFactura(factura, DetallesPAG);
        if (resultadoTransaccion == true)
        {
            
            ClientScript.RegisterStartupScript(GetType(), "alerta2()", "alerta2()", true);
            Response.Redirect("InformeEjemplaresVendidos.aspx");
        }
        
        //nueva();
    }
    protected void btn_Aceptar_Click(object sender, EventArgs e)
    {
        if (grd_Seleccion.Rows.Count > 0)
        {
            lbl_alertaRegistracion.Visible = false;
            if (Page.IsValid)
            {
                bool resultadoTransaccion;
                List<DetalleFacturaEnt> detalles = ((List<DetalleFacturaEnt>)Session["ListaDetalle"]);
                FacturaEnt factura = new FacturaEnt();
                UsuarioDAO interfazUsuario = new UsuarioDAO();
                UsuarioEnt usuarioVenta = new UsuarioEnt();
                VentaDAO interfazDAO = new VentaDAO();

                usuarioVenta = (interfazUsuario.buscarUsuarioFiltro(" AND u.legajo=" + Context.User.Identity.Name + " ")).ElementAt(0); 
                factura.Fecha = DateTime.Parse(txtFecha.Text);
                factura.Numero = int.Parse(txt_NroFactura.Text);
                factura.UsuarioID = usuarioVenta.id_Usuario;
                factura.Total = decimal.Parse(txtTotal.Text);
                factura.TipoFacturaID = cboTipoFactura.SelectedIndex;

                resultadoTransaccion = interfazDAO.GuardarFactura(factura, detalles);

                if (resultadoTransaccion == true)
                {
                    
                    ClientScript.RegisterStartupScript(GetType(), "alerta()", "alerta()", true);
                    Response.Redirect("InformeEjemplaresVendidos.aspx");
                   
                }
                
               
            }
        }
        else
        {
            lbl_alertaRegistracion.Visible = true;

        }
    }
    public void cargarComboTipoFactura()
    {
        interfazDAO = new VentaDAO();
        cboTipoFactura.DataSource = interfazDAO.obtenerTipoFactura();
        cboTipoFactura.DataTextField = "nombre";
        cboTipoFactura.DataValueField = "id_TipoFactura";
        cboTipoFactura.DataBind();
        cboTipoFactura.Items.Insert(0, new ListItem(("Sin Selección"), ""));
        cboTipoFactura.SelectedIndex = 0;

    }
    public void cargarGrilla(List<EjemplarBusquedaQueryEnt> ejemplares)
    {
        interfazDAO = new VentaDAO();
        grd_Ejemplares.DataSource = ejemplares;
        grd_Ejemplares.DataKeyNames = new String[] { "id_Ejemplar" };
        grd_Ejemplares.DataBind();
    }
    public void cargarGrillaSeleccion(List<EjemplarBusquedaQueryEnt> ejemplaresSelec)
    {
        Session["ListaSeleccion"] = ejemplaresSelec;
        grd_Seleccion.DataSource = ejemplaresSelec;
        grd_Seleccion.DataKeyNames = new String[] { "id_Ejemplar" };
        grd_Seleccion.DataBind();
    }
    protected void grd_Ejemplares_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {


        List<EjemplarBusquedaQueryEnt> ejemplares = (List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"];
        EjemplarBusquedaQueryEnt ejemplar = ejemplares.ElementAt(e.NewSelectedIndex);
        DetalleFacturaEnt detalleWeb = new DetalleFacturaEnt();
      

        ((List<EjemplarBusquedaQueryEnt>)Session["ListaSeleccion"]).Add(ejemplares.ElementAt(e.NewSelectedIndex));
        cargarGrillaSeleccion((List<EjemplarBusquedaQueryEnt>)Session["ListaSeleccion"]);

        detalleWeb.id_Ejemplar = (int)ejemplar.Id_Ejemplar;
    
        detalleWeb.precio = (decimal)ejemplar.Precio;

        ((List<DetalleFacturaEnt>)Session["ListaDetalle"]).Add(detalleWeb);


        ((List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"]).Remove(ejemplares.ElementAt(e.NewSelectedIndex));
        cargarGrilla((List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"]);
        txtTotal.Text = (calcularTotal()).ToString();

    }


    protected void grd_Seleccion_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {

        List<EjemplarBusquedaQueryEnt> ejemplaresSeleccion = (List<EjemplarBusquedaQueryEnt>)Session["ListaSeleccion"];
        EjemplarBusquedaQueryEnt ejemplar = ejemplaresSeleccion.ElementAt(e.NewSelectedIndex);
        DetalleFacturaEnt detalleWeb = new DetalleFacturaEnt();


        ((List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"]).Add(ejemplaresSeleccion.ElementAt(e.NewSelectedIndex));
        cargarGrilla((List<EjemplarBusquedaQueryEnt>)Session["ListaEjemplares"]);

        ((List<EjemplarBusquedaQueryEnt>)Session["ListaSeleccion"]).Remove(ejemplaresSeleccion.ElementAt(e.NewSelectedIndex));
        cargarGrillaSeleccion((List<EjemplarBusquedaQueryEnt>)Session["ListaSeleccion"]);

        detalleWeb.id_Ejemplar = (int)ejemplar.Id_Ejemplar;
        ((List<DetalleFacturaEnt>)Session["ListaDetalle"]).Remove(detalleWeb);

        txtTotal.Text = (calcularTotal() - ObtenerCostoRestauracion(ejemplar.Codigo)).ToString();
    }

    protected Decimal ObtenerCostoRestauracion(int codigo)
    {
        decimal costo = 0;
        RestauracionDAO restauracionDAO = new RestauracionDAO();
        RestauracionEnt restauracion = new RestauracionEnt();
        restauracion = restauracionDAO.ObtenerRestauracion(codigo);
        if (restauracion != null)
        {
            costo = restauracion.Costo;
        }
        return costo;

    }
    protected Decimal calcularTotal()
    {
        decimal total = 0.0m;
        foreach (GridViewRow fila in grd_Seleccion.Rows)
        {
            total += decimal.Parse(fila.Cells[3].Text);
        }
        return total;
    }




}

